package com.man.controller;

import com.man.pojo.Book;
import com.man.pojo.User;
import com.man.service.LoginService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @CallsName: ApiController
 */
@Controller
@Log4j2
@Validated
@CrossOrigin    //支持跨域后
public class ApiController {
    @Autowired
    private LoginService loginService;
    /*------------------------------------*/
    /*注册*/
    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        String email = user.getEmail();
        User existingUser = loginService.getByUser(username);
        if (existingUser != null) {
            return new ResponseEntity<>("用户名已存在", HttpStatus.CONFLICT);/*409*/
        }
        loginService.save(username, email, password);
        return ResponseEntity.ok("注册成功");
    }
    /*-------------------------------------------------------------------------------------------------*/
    /*305 Use Proxy：请求者应当使用代理进行请求。
      307 Temporary Redirect：临时重定向，请求者应继续使用原有的请求 URI。
      308 Permanent Redirect：永久重定向，请求者应使用新的请求 URI。
      400 Bad Request：请求无效，服务器无法理解。
      401 Unauthorized：请求需要用户认证。
      402 Payment Required：预留状态码，未来可能使用。
      403 Forbidden：服务器拒绝请求。
      404 Not Found：请求的资源未找到。
      405 Method Not Allowed：请求中的方法被禁止。
      406 Not Acceptable：服务器无法根据请求的内容特性完成请求。
      407 Proxy Authentication Required：要求进行代理身份验证。
      408 Request Timeout：请求超时。
      CONFLICT (409)：表示由于请求的资源与资源的当前状态之间存在冲突而无法完成请求。
      GONE (410)：表示所请求的资源已永久不存在，并且不会再被服务器接受。
      LENGTH_REQUIRED (411)：表示服务器要求在请求中包含 Content-Length 头字段。
      PRECONDITION_FAILED (412)：表示服务器在验证在请求的头字段中给出先决条件时，发现先决条件为假。
      PAYLOAD_TOO_LARGE (413)：表示请求的实体过大，服务器无法处理。
      413 REQUEST_ENTITY_TOO_LARGE: 表示请求实体过大，服务器无法处理。
      414 URI_TOO_LONG: 表示请求的 URI 过长，服务器无法处理。
      415 UNSUPPORTED_MEDIA_TYPE: 表示请求的媒体类型不受支持，服务器无法处理。
      416 REQUESTED_RANGE_NOT_SATISFIABLE: 表示请求的范围无法满足，通常用于请求头中的 Range 字段。
      417 EXPECTATION_FAILED: 表示服务器无法满足请求中 Expect 头部字段指定的期望值。
      418 I_AM_A_TEAPOT: 是一个愚人节玩笑状态码，表示服务器是一台茶壶，不会处理该请求。
      422 UNPROCESSABLE_ENTITY: 表示服务器无法处理请求，因为请求实体中存在语法错误或无法处理的字段。
      423 LOCKED: 表示资源被锁定，无法访问。
      424 FAILED_DEPENDENCY: 表示请求失败，因为请求的先决条件失败。
      429 TOO_MANY_REQUESTS: 表示请求过多，服务器拒绝服务。
      431 REQUEST_HEADER_FIELDS_TOO_LARGE: 表示请求头字段太大，服务器无法处理。
      500 INTERNAL_SERVER_ERROR: 表示服务器内部错误。
      501 NOT_IMPLEMENTED: 表示服务器不支持请求的功能，因此无法完成请求。
      502 BAD_GATEWAY: 表示服务器作为网关或代理，从上游服务器收到无效响应。
      503 SERVICE_UNAVAILABLE: 表示服务器当前无法处理请求，通常是由于维护或过载。
      504 GATEWAY_TIMEOUT: 表示服务器作为网关或代理，未及时从上游服务器接收到响应。
      505 HTTP_VERSION_NOT_SUPPORTED: 表示服务器不支持请求中所使用的 HTTP 协议版本。
      507 INSUFFICIENT_STORAGE: 表示服务器无法存储完成请求所必需的内容。
      511 NETWORK_AUTHENTICATION_REQUIRED: 表示客户端需要进行身份验证才能获得网络访问权限。
      这些状态码分别属于不同的类别，如 2xx 表示成功，3xx 表示重定向，4xx 表示客户端错误，5xx 表示服务器错误等。*/
    /*-------------------------------------------------------------------------------------------------*/


    /*------------------------------------*/
    /*首页*/
    @PostMapping("/index")
    public String index(String name, HttpServletRequest request) {
        List<Book> book = loginService.getBookAll();
        request.getSession().setAttribute("book", book);
        return "book";
    }

    /*----------------------------*/
    /*更新邮箱*/
    @PostMapping("/update")
    public ResponseEntity<?> update(@RequestBody @Validated User user, HttpServletRequest request) {
        if (user == null){
            return new ResponseEntity<>("更新邮箱失败", HttpStatus.UNPROCESSABLE_ENTITY);/*422*/
        }
        loginService.modify(user);
        log.info("更新邮箱成 功！！！！！");
        List<User> all = loginService.getAll();
        request.getSession().setAttribute("user", all);
        return ResponseEntity.ok("更新邮箱成功");
    }

    /*----------------------------*/
    /*删除*/
    @PostMapping("/delete")
    public String delete(@RequestBody User username, HttpServletRequest request) {
        loginService.deleteByUserImpl(username);
        List<User> all = loginService.getAll();
        request.getSession().setAttribute("user", all);
        return "index";
    }

    /*----------------------------*/
    /*更新书籍*/
    @PostMapping("/book")
    public ResponseEntity<String> book(HttpServletRequest request) {
        List<Book> book = loginService.getBookAll();
        request.getSession().setAttribute("book", book);
        // 这里可以根据传入的url参数获取数据，并返回给前端
        // 这里仅为示例，实际逻辑需要根据你的需求编写
        return ResponseEntity.ok("获取数据成功！");
    }

    /*-----------------------------*/
    /*添加书籍*/
    @PostMapping("/addBook")
    public ResponseEntity<String> addBook(@RequestBody Book book, HttpServletRequest request) {
        String book1 = book.getBook();
        String bookName = book.getBookName();
        loginService.saveBook(book1, bookName);
        List<Book> bookAll = loginService.getBookAll();
        request.getSession().setAttribute("book", bookAll);
        return ResponseEntity.ok("获取数据成功！");
    }

    /*--------------------*/
    /*删除书籍*/
    @PostMapping("/deleteBook")
    public ResponseEntity<String> deleteBook(@RequestBody Book book, HttpServletRequest request) {
        int id = book.getId();
        String book1 = book.getBook();
        loginService.deleteBook(book1, id);
        List<Book> bookAll = loginService.getBookAll();
        request.getSession().setAttribute("book", bookAll);
        return ResponseEntity.ok("删除成功！");
    }

    /*-----------------------------------------------*/
    /*修改密码*/
    @PostMapping("/changePassword")
    public String changePassword() {
        return "changePassword";
    }

    @PostMapping("/changePassword1")
    public ResponseEntity<Map<String, Boolean>> changePassword1(@RequestBody User user, HttpServletRequest request) {
        Integer id = user.getId();
        String password = user.getPassword();
        String username = user.getUsername();
        boolean success = loginService.updatePwd(password, id);
        Map<String, Boolean> response = new HashMap<>();
        response.put("success", success);
        User users = loginService.getByUser(username);
        request.getSession().setAttribute("users", users);
        return ResponseEntity.ok(response);
    }


    /*-----------------------------------------------*/
    /*-----------------------------------------------*/
    /*退出登录*/
    @PostMapping("/logout")
    public ResponseEntity<String> logout(HttpSession session) {
        session.invalidate(); // 使当前会话无效，清除会话数据
        return ResponseEntity.ok("{\"redirect\": \"/login.html\"}");
    }
}
